#pragma once
#include <iostream>
#include <functional>
#include "InetAddr.hpp"
#include "Log.hpp"
#include "Protocol.hpp"
#include "Connection.hpp"
#include "NetCal.hpp"

using namespace log_ns;


class PackageParse
{
public:
    void Excute(Connection *conn)
    {
        while (true)
        {
            // 我们能保证读到的是完整的报文？ 不能！
            // 2.报文解析，提取报头和有效载荷
            std::string package = Decode(conn->Inbuffer());
            if(package.empty()) break;
            // 我们能保证读到的是一个完整的报文！！！
            auto req = Factory::BuildRequestDefault();
            std::cout << "package: \n" << package << std::endl;

            // 3.反序列化
            req->Deserialize(package); // 反序列化 将字符串转成结构化

            // 4.业务处理
            // auto resp = _process(req); // 业务处理(通过请求，得到应答)
            auto resp = cal.Calculator(req);

            // 5.序列化应答
            std::string respjson;
            resp->Serialize(&respjson); // 序列化
            std::cout << "respjson: \n" << respjson << std::endl;

            // 6.添加len长度
            respjson = Encode(respjson);
            std::cout << "respjson add header done: \n" << respjson << std::endl;

            // 7.发送回去
            conn->AppendOutBuffer(respjson);
        }
        // 我们至少处理了一个请求，同时至少会有一个应答
        // if(!conn->OutBuffer().empty()) conn->_handler_sender(conn); // 方法1: 直接发送数据
        if(!conn->OutBuffer().empty()) 
            conn->_R->EnableConnectionReadWrite(conn->Sockfd(),true,true); // 方法2: 我只要进行激活对写事件的关系即可

    }
    ~PackageParse()
    {
    }
private:
    NetCal cal;
};